import Guide from "../components/layouts/Guide"
import styles from "./introduction-to-vertx-and-reactive.scss"
import Link from "next/link"

<Guide title="Vert.x 和响应式编程简介">

# Vert.x 和响应式编程简介

Eclipse Vert.x 是JVM上构建 **响应式** 应用的工具。
响应式应用既可以随着工作负载的增长而 **扩展** ，又可以在出现故障时 **弹性回复** 。
响应式应用是 **即时响应** 的，因为它能有效利用系统资源并保护自身免受错误影响，从而使延迟可控。

<img src={require("../assets/introduction/microservices.svg")} alt="Microservices" />

Vert.x 背靠庞大的响应式模块生态系统，具有编写现代服务所需的一切：全面的Web技术栈，响应式数据库驱动程序、消息队列、事件流、集群支持、指标监控、分布式跟踪等等。

Vert.x 是工具包，而不是暗含黑魔法的框架：**所写即所得**，就这么简单。

那么，是什么使 Vert.x 成为编写 **云原生** 和 **[12因素（12-Factor）](https://12factor.net/)** 应用程序的最佳选择？

## 从前，有一些线程...

实现并发的经典方法是使用 **线程**。
多个线程可以在同一个 **进程** 中存活，**并行** 地执行工作，并 **共享** 同一片内存空间。

<img src={require("../assets/introduction/threads.svg")} alt="Threads" className="img-threads" />

大多数应用程序和服务开发框架都基于多线程。
从表面上看，**每个连接对应一个线程** 的模型令人放心，因为开发人员可以使用传统的 **命令式** 代码。

这一切挺好的，如果使用多线程进行内存访问时可能犯的那些愚蠢错误可以忽略的话……

## 多线程很简单，但有局限性

当工作负载超出中等水平时，会发生什么？
[（请参阅C10k问题）](https://en.wikipedia.org/wiki/C10k_problem)

答案很简单：操作系统内核变得 **非常痛苦**，因为多线程处理这些请求会产生太多的 **上下文切换** 动作。

<img src={require("../assets/introduction/blocking-io.svg")} alt="Blocking I/O" />

一些线程正在等待I/O操作完成而被 **阻塞**，一些线程已 **准备好** 处理I/O结果，而一些线程正在执行CPU密集型操作任务。

现代内核具有非常好的调度程序，但是不能指望它们处理50&thinsp;000个线程还会像处理5&thinsp;000个线程那样轻松。同样地，创建线程的成本也不低：创建线程需要花费若干毫秒，而且新线程会消耗大约1MB的内存。

## 异步编程：可伸缩性和资源利用率

当您使用 **异步I/O** 时，可以用更少的线程处理更多的并发连接。
当一个任务发生了I/O操作时，异步I/O不会阻塞线程，而是执行其他待处理的任务，待到I/O结果准备好后再继续执行该任务。

Vert.x 使用 **事件循环（eventloop）** 多路复用并发处理工作负载。

<img src={require("../assets/introduction/event-loop.svg")} alt="Event loop" />

在事件循环上运行的代码不应执行阻塞I/O及长时间的处理逻辑。但是，如果有这样的代码，也无需担心，因为 Vert.x 具有 Worker 线程和对应API，可以在事件循环中处理这样的代码。

## 为您的需求选择最佳的异步编程模型

我们知道异步编程需要更多的努力。
Vert.x core 支持 **回调** 和 **Promise/Future**，后者是用于链接异步操作的简单优雅的模型。

[RxJava](https://github.com/ReactiveX/RxJava) 可以进行高级响应式编程；如果您更喜欢传统的命令式编程，那么我们也提供了 [Kotlin协程](https://kotlinlang.org/docs/reference/coroutines-overview.html) 的头等支持。

<img src={require("../assets/introduction/async.svg")} alt="Asynchronous programming" />

Vert.x 支持许多异步编程模型，请根据您需要解决的具体问题去选择最佳的模型！

## 不要让失败破坏响应能力

失败总会发生。
数据库会宕机，网络会断开，或者您依赖的某些服务会无法响应。

<img src={require("../assets/introduction/failures.svg")} alt="Failures" />

Vert.x 提供了控制延迟的工具，包括简单有效的 **断路器**。

## 丰富的生态系统

_Eclipse Vert.x 技术栈_ 包含了用于构建现代应用程、端到端响应式服务的模块。
从高效的响应式数据库客户端，到事件流、消息传递和 Web 技术栈等，Eclipse Vert.x 项目覆盖了：

<img src={require("../assets/introduction/ecosystem.svg")} alt="Ecosystem" />

找到不你想要的？

* [The Reactiverse](https://reactiverse.io) 是一个围绕响应性生态系统的大型社区，您可以在其中找到更多的客户端和模块。
* [Vert.x Awesome](https://github.com/vert-x3/vertx-awesome) 仓库，提供了更多来自大型开源社区的更有趣项目的链接！

## 准备好编写代码了吗？

请参考 <Link href="/get-started" passHref={true}><a>开始</a></Link> 页面进行操作!

<style jsx>{styles}</style>

</Guide>
